import axios from 'axios';

// 固定的 API 基础地址
const API_URL = "http://localhost:8080/api/bankers";

/**
 * 执行安全检查
 * @param {Object} state - 系统状态对象
 * @returns {Promise<Object>} 安全检查结果
 */
export const checkSafety = async (state) => {
    try {
        const response = await axios.post(`${API_URL}/check-safety`, state);
        // 确保 explanation 是字符串类型
        const data = response.data;
        if (data.explanation && typeof data.explanation !== 'string') {
            data.explanation = JSON.stringify(data.explanation);
        }
        return data;
    } catch (error) {
        handleApiError(error, "安全检查失败");
        throw error;
    }
};

/**
 * 获取算法解释
 * @param {Object} state - 系统状态对象
 * @param {Object} [result] - 安全检查结果（可选）
 * @returns {Promise<String>} 算法解释文本
 */
export const explainSafety = async (state, result) => {
    try {
        const context = result ? JSON.stringify(result) : "请求算法流程解释";
        const response = await axios.post(`${API_URL}/explain-algorithm`, {
            ...state,
            context
        });


        return response.data.explanation;
    } catch (error) {
        handleApiError(error, "获取算法解释失败");
        throw error;
    }
};

/**
 * 执行死锁诊断
 * @param {Object} state - 系统状态对象
 * @param {Array<Number>} processIds - 怀疑发生死锁的进程ID数组
 * @returns {Promise<Object>} 死锁诊断结果
 */
export const diagnoseDeadlock = async (state, processIds) => {
    try {
        const response = await axios.post(`${API_URL}/diagnose-deadlock`,
            state, // 仅将系统状态作为请求体
            {
                params: {
                    deadlockProcesses: processIds.join(',') // 作为查询参数
                }
            }
        );

        return response.data;
    } catch (error) {
        handleApiError(error, "死锁诊断失败");
        throw error;
    }
};

/**
 * 处理 API 错误
 * @param {Error} error - 原始错误对象
 * @param {String} defaultMessage - 默认错误消息
 * @throws {Error} 带有详细信息的错误
 */
function handleApiError(error, defaultMessage) {
    let errorMessage = defaultMessage;

    if (error.response) {
        // 从 API 响应中提取错误消息
        errorMessage = error.response.data?.error ||
            error.response.data?.message ||
            `${error.response.status} ${error.response.statusText}`;
    } else if (error.request) {
        // 请求已发送但无响应
        errorMessage = `服务器无响应: ${error.request}`;
    } else {
        // 请求未发送
        errorMessage = `请求设置失败: ${error.message}`;
    }

    console.error(errorMessage, error);
    throw new Error(errorMessage);
}